import http from '@/utils/request'
import store, { AppDispatch } from '..'

/**
 * 获取文章新闻推荐
 * @param channel_id 频道ID
 * @param timestamp  时间戳，请求新的推荐数据传当前的时间戳，请求历史推荐传指定的时间戳
 * @returns
 */
export const getArticlesAPI = ({
  channel_id = 0,
  timestamp = Date.now(),
  isRefresh = false,
}) => {
  return async (dispatch: AppDispatch) => {
    const res = await http.get('/v1_0/articles', {
      params: { channel_id, timestamp },
    })
    // console.log(res)

    // 先获取仓库数据
    const { articles } = store.getState().article
    // 🔔 获取当前频道的新闻列表,可能获取到 undefined 或者 新闻数组
    const list = articles[channel_id]?.list
    // 后台返回的时间戳
    const pre_timestamp = res.data.pre_timestamp
    //  如果是刷新业务，也是用新的数据覆盖旧数据
    if (!list || isRefresh) {
      // 🔔情况1: 如果没有列表,就直接存
      dispatch({
        type: 'article/saveArticles',
        payload: {
          // 展开原本的频道新闻数据
          ...articles,
          // 再追加新的频道新闻数据
          // 🎯 注意这里要设置动态的频道 id，需要使用方括号[]语法动态设置键名称
          [channel_id]: {
            // 需要把后端返回的时间戳存起来，用于分页请求，防止出现重复的推荐
            timestamp: pre_timestamp,
            list: res.data.results,
          },
        },
      })
    } else {
      // 🔔情况2:如果有列表,需要把新,旧两份数组拼接在一起
      dispatch({
        type: 'article/saveArticles',
        payload: {
          ...articles,
          [channel_id]: {
            // 需要把后端返回的时间戳存起来，用于分页请求，防止出现重复的推荐
            timestamp: pre_timestamp,
            list: [...list, ...res.data.results],
          },
        },
      })
    }

    // 分页停止条件
    if (!pre_timestamp) {
      return Promise.reject('没有更多数据了')
    }
  }
}

/**
 * 文章标记 -  文章不感兴趣和举报
 * @param visible     用于控制标记弹窗的显示与隐藏
 * @param article_id  需要标记的文章 id
 * @param param0
 * @returns
 */
export const setArticleMarkAPI = ({ visible = false, article_id = '' }) => {
  return async (dispatch: AppDispatch) => {
    dispatch({ type: 'article/setMark', payload: { visible, article_id } })
  }
}

/**
 * 文章标记为不喜欢
 * @param target
 * @returns
 */
export const setDislikeArticleAPI = (target: string) => {
  return async (dispatch: AppDispatch) => {
    // 发送请求让后端更新文章的标记为不喜欢
    await http.post('/v1_0/article/dislikes', { target })
    // 获取当前 频道 id
    const activeId = store.getState().channel.activeId
    // 获取文章集合大对象
    const articles = store.getState().article.articles
    // 根据 id 获取对应文章列表
    const { list, timestamp } = articles[activeId]

    dispatch({
      type: 'article/saveArticles',
      payload: {
        // 保留其他频道数据
        ...articles,
        // 过滤掉当前频道不喜欢的那条数据
        [activeId]: {
          timestamp,
          list: list.filter((item) => item.art_id !== target),
        },
      },
    })
  }
}

/**
 * target  举报的文章id
 * type  举报类型： 0-其他问题，1-标题夸张，2-低俗色情，3-错别字多，4-旧闻重复，5-广告软文，6-内容不实，7-涉嫌违法犯罪，8-侵权'
 * remark  其他问题 的附加说明
 * @param param0
 * @returns
 */
export const setArticleReportsAPI = ({
  target = '',
  type = '0',
  remark = '',
}) => {
  return async (dispatch: AppDispatch) => {
    await http.post('/v1_0/article/reports', { target, type, remark })
    // 获取当前 频道 id
    const activeId = store.getState().channel.activeId
    // 获取文章集合大对象
    const articles = store.getState().article.articles
    // 根据 id 获取对应文章列表
    const { list, timestamp } = articles[activeId]

    dispatch({
      type: 'article/saveArticles',
      payload: {
        // 保留其他频道数据
        ...articles,
        // 过滤掉当前频道不喜欢的那条数据
        [activeId]: {
          timestamp,
          list: list.filter((item) => item.art_id !== target),
        },
      },
    })
  }
}

/**
 * 获取文章详情
 * @param article_id
 * @returns
 */
export const getArticleDetailsAPI = (article_id: string) => {
  return async (dispatch: AppDispatch) => {
    const res = await http.get(`/v1_0/articles/${article_id}`)
    dispatch({ type: 'article/saveDetail', payload: res.data })
  }
}
